/*
 * 文件名：FileZipUtil.java
 * 版权：Copyright by http://www.znjf.com/
 * 描述：
 * 修改人：Awoke
 * 修改时间：2018年4月26日
 * 跟踪单号：
 * 修改单号：
 * 修改内容：
 */

package top.infopub.util;


import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * Zip压缩工具类
 * @author Awoke
 * @version 2018年4月26日
 * @see FileZipUtil
 * @since
 */
public final class FileZipUtil {

    private static final Logger log = LoggerFactory.getLogger(FileZipUtil.class);

    public FileZipUtil() {}

    /**
     * 压缩文件|夹  
     * @param srcfile 需要压缩的源文件|夹 
     * @return 返回srcFile同目录下的同名.zip File
     * @see
     */
    public static File zip(File srcfile) {
        if (srcfile == null) {
            return null;
        }
        ZipOutputStream out = null;
        File targetFile = null;
        try {
            targetFile = new File(getTargetFilePath(srcfile));
            out = new ZipOutputStream(new FileOutputStream(targetFile));
            // 添加对应的文件Entry
            addEntry("", srcfile, out);
        }
        catch (Exception e) {
            log.error("FileZipUtil#zip occurs exception", e);
        }
        finally {
            IOUtils.closeQuietly(out);
        }
        return targetFile;
    }

    /**
     * 返回srcFile同目录下的.zip文件名
     * @param srcFile
     * @return 
     * @see
     */
    private static String getTargetFilePath(File srcfile)
        throws Exception {
        String targetFilePath = "";
        if (srcfile.isFile()) {
            String srcfilePath = srcfile.getPath();
            String ext = FilenameUtils.getExtension(srcfilePath);
            targetFilePath = srcfilePath.substring(0, srcfilePath.length() - ext.length()) + "zip";
        }
        else {
            targetFilePath = srcfile.getPath() + ".zip";
        }
        // 先删除原zip文件
        File targetFile = new File(targetFilePath);
        if (targetFile.exists()) {
            FileUtils.forceDelete(targetFile);
        }
        return targetFilePath;
    }

    /**
     * 扫描添加文件Entry
     * @param base   基路径
     * @param source 源文件
     * @param zos    Zip文件输出流
     * @throws IOException
     */
    private static void addEntry(String base, File source, ZipOutputStream zos)
        throws IOException {
        // 按目录分级，形如：/aaa/bbb.txt
        String entry = base + source.getName();
        if (source.isDirectory()) {
            for (File file : source.listFiles()) {
                // 递归列出目录下的所有文件，添加文件Entry
                addEntry(entry + "/", file, zos);
            }
        }
        else {
            // 目前是只压缩文件夹下pdf文件
            // if (FilenameUtils.getExtension(source.getPath()).equals("pdf")) {
            FileInputStream fis = null;
            BufferedInputStream bis = null;
            try {
                byte[] buffer = new byte[1024 * 10];
                fis = new FileInputStream(source);
                bis = new BufferedInputStream(fis, buffer.length);
                int read = 0;
                zos.putNextEntry(new ZipEntry(entry));
                while ((read = bis.read(buffer, 0, buffer.length)) != -1) {
                    zos.write(buffer, 0, read);
                }
                zos.closeEntry();
            }
            finally {
                IOUtils.closeQuietly(fis);
                IOUtils.closeQuietly(bis);
            }
            //}
        }
    }

    public static void main(String[] args) {
        zip(new File("E:/opt/tziba/data/pdf/0AC84C6082F645FAB63F775360D2A954Sign"));
        //zip(new File("D:/pdf/TZ201712250000001.pdf"));
        //String pdf = "E:/opt/tziba/data/pdf/0AC84C6082F645FAB63F775360D2A954Sign";
        //System.out.println(FilenameUtils.getFullPathNoEndSeparator(pdf));
        //System.out.println(FilenameUtils.getName(pdf));
    }
}
